package com.sheng.leetcode.year2024.month01.day02;

import org.junit.Test;

/**
 * @author by ls
 * @date 2024/1/2
 * <p>
 * 466. 统计重复个数<p>
 * <p>
 * 定义 str = [s, n] 表示 str 由 n 个字符串 s 连接构成。<p>
 * 例如，str == ["abc", 3] =="abcabcabc" 。<p>
 * 如果可以从 s2 中删除某些字符使其变为 s1，则称字符串 s1 可以从字符串 s2 获得。<p>
 * 例如，根据定义，s1 = "abc" 可以从 s2 = "abdbec" 获得，仅需要删除加粗且用斜体标识的字符。<p>
 * 现在给你两个字符串 s1 和 s2 和两个整数 n1 和 n2 。<p>
 * 由此构造得到两个字符串，其中 str1 = [s1, n1]、str2 = [s2, n2] 。<p>
 * 请你找出一个最大整数 m ，以满足 str = [str2, m] 可以从 str1 获得。<p>
 * <p>
 * 示例 1：<p>
 * 输入：s1 = "acb", n1 = 4, s2 = "ab", n2 = 2<p>
 * 输出：2<p>
 * <p>
 * 示例 2：<p>
 * 输入：s1 = "acb", n1 = 1, s2 = "acb", n2 = 1<p>
 * 输出：1<p>
 * <p>
 * 提示：<p>
 * 1 <= s1.length, s2.length <= 100<p>
 * s1 和 s2 由小写英文字母组成<p>
 * 1 <= n1, n2 <= 10^6<p>
 */
public class LeetCode0466 {

    @Test
    public void test01() {
        String s1 = "acb", s2 = "ab";
        int n1 = 4, n2 = 2;
//        String s1 = "acb", s2 = "acb";
//        int n1 = 1, n2 = 1;
        System.out.println(new Solution().getMaxRepetitions(s1, n1, s2, n2));
    }
}

class Solution {
    public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
        // str1 最多能获取几个 str2，问题转化一下，需要确认，s1 最少需要多少个才能获取一个 str2
        int m = s1.length(), n = s2.length();
        int[][] d = new int[n][0];
        for (int i = 0; i < n; ++i) {
            int j = i;
            int cnt = 0;
            for (int k = 0; k < m; ++k) {
                if (s1.charAt(k) == s2.charAt(j)) {
                    if (++j == n) {
                        j = 0;
                        ++cnt;
                    }
                }
            }
            d[i] = new int[]{cnt, j};
        }
        int ans = 0;
        for (int j = 0; n1 > 0; --n1) {
            ans += d[j][0];
            j = d[j][1];
        }
        return ans / n2;
    }
}
